<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
  
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

  
  <link href="../css/style.css" rel="stylesheet" type="text/css">

</head>
<body>
<h1>Лабораторная работа №2</h1>
<p class="article">
Тема работы. Использование сервисных функций DOS ввода-вывода и работа со строками. <br />
Цель работы. Научиться работать с некоторыми функциями 21-го прерывания и строковыми переменными. Понять структуру таблицы ASCII кодов. <br />
Содержание работы. В данной работе происходит знакомство с функциями DOS 21-го прерывания. Вызов функций, параметры входа и параметры вывода.
</p>
<pre class="code" style="max-height: none;">
		IDEAL
MODEL	small
STACK	256
descrip_in	=	0	;Дескриптор стандартного ввода
descrip_out	=	1	;Дескриптор стандартного вывода
descrip_err	=	2	;Дескриптор стандартной ошибки (экрана)
		DATASEG
msg	Db	'Введите строку!',10,13,'$'
Buf	DB	80 DUP(?)
act_in	DW	?
		CODESEG
Start:		mov ax,@data	
			mov ds,ax	
			mov ah,09h			;Функция вывода
			mov dx,offset msg	;Адрес сообщения
			int 21h
			mov ah,3fh			;Функция ввода
			mov bx,descrip_in
			mov cx,80			;Ввод максимум 80 байт
			mov dx,offset Buf	;Адрес буфера
			int 21h
			mov [act_in],ax		;Фактически введено
			mov cx,[act_in]		;Счётчик элементов строки
			mov  si,0			;Инициализация указателя элементов строки
filter:		mov al,[Buf+si]		;Возьмём символ
			cmp al,'a'			;Меньше 'a'?
			jb no_letter		;Да, не преобразовывать
			cmp al,'z'			;Больше 'z'?
			ja no_letter		;Да, не преобразовывать
			sub al,20h			;Преобразуем в прописную
			mov [Buf+si],al		;Отправим в Buf
no_letter:	inc si
			loop filter			;Цикл
			mov ah,40h			;Функция вывода
			mov bx,descrip_out
			mov cx,[act_in]		;Длина сообщения
			mov dx,offset Buf	;Адрес сообщения
			int 21h
Exit:		mov ax,4C00h
			int 21h	
END Start	
</pre>
<p class="article">
В данной программе происходит ввод строки с клавиатуры с дальнейшим преобразованием полученых строчных символов в прописные.
Программа состоит из 3х основных логических блоков - ввода строки, преобразования строчных символов в прописные и вывод получившейся строки. Сначала с помощью функции 09h выводится сервисное сообщение "Введите строку", затем, функцией 3Fh производится ввод строки с клавиатуры, поскольку строковой переменной Buf в сегменте данных было выделено максимум 80 байт, то в счетчик CX так же нужно загрузить число не более 80. В регистр BX загружается  дескриптор стандартного ввода, в регистр DX смещение буфера ввода.
</p>
<h2>Задания к работе.</h2>
<ol class="article">
	<li>
	Измените программу таким образом, чтобы в случае, если в веденной строке не оказалось ни одной строчной латинской буквы, программа бы потребовала повторного воода строки.
	</li>
	<li>
	Измените блок вывода строки таким образом, что бы вывод производился средствами функции 09h, а не 40h.
	</li>
</ol>




</body>
</html>
